package tool

import (
	"net"
	"strings"

	"github.com/gin-gonic/gin"
)

// 获取客户端IP地址，考虑负载均衡和代理
func GetClientIP(c *gin.Context) string {
	// 尝试从X-Forwarded-For头部获取IP地址
	xForwardedFor := c.Request.Header.Get("X-Forwarded-For")

	// 如果存在X-Forwarded-For头部，解析第一个IP地址（可能是原始请求的IP）
	if xForwardedFor != "" {
		// 使用net.SplitHostPort分割IP和端口，如果存在端口，只取IP部分
		ips := strings.Split(xForwardedFor, ",")
		if len(ips) > 0 {
			// 通常第一个IP是客户端的真实IP
			clientIP, _, err := net.SplitHostPort(ips[0])
			if err != nil {
				// 如果分割失败，返回原始IP
				return ips[0]
			}
			return clientIP
		}
	}

	// 如果没有X-Forwarded-For头部，或解析失败，回退到使用X-Real-IP
	xRealIP := c.Request.Header.Get("X-Real-IP")
	if xRealIP != "" {
		return xRealIP
	}

	// 如果以上都失败，使用Gin的ClientIP方法作为最后的手段
	return c.ClientIP()
}
